#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include "algorithm"
#include   "queue"

using namespace std;

/**
 * 556. 下一个更大元素 III
中等
314
相关企业
给你一个正整数 n ，请你找出符合条件的最小整数，其由重新排列 n 中存在的每位数字组成，并且其值大于 n 。如果不存在这样的正整数，则返回 -1 。
注意 ，返回的整数应当是一个 32 位整数 ，如果存在满足题意的答案，但不是 32 位整数 ，同样返回 -1 。
示例 1：
输入：n = 12
输出：21
示例 2：
输入：n = 21
输出：-1
 *
 * ***/

int getNextPermenutaion(vector<int> &res) {
    for (int i = res.size() - 1; i > 0; i--) {
        //说明能找到比他大的
        if (res[i - 1] < res[i]) {
            for (int j = res.size() - 1; j > i - 1; j--) {
                if (res[i - 1] < res[j]) {
                    swap(res[j], res[i - 1]);
                    sort(res.begin() + i, res.end());
                    goto label;
                }
            }

        }

    }

    //如果没进入循环说明了反转就是最大的
    //reverse(res.begin(),res.end());

    label:;

    unsigned long ans = 0;//1 2 3 4
    // std::string result(res.begin(), res.end());
    unsigned long f = 1;
    for (int i = res.size() - 1; i >= 0; --i) {
        ans += res[i] * f;
        f *= 10;

    }
    if (ans > INT_MAX)
        return -1;

    return ans;

}

int nextGreaterElement(int n) {


    vector<int> res;
    int b = n;
    while (b > 0) {
        res.push_back(b % 10);
        b = b / 10;
    }
    reverse(res.begin(), res.end());

    auto result = getNextPermenutaion(res);

    if (result == n || result == -1)
        return -1;

    return result;

}